スイッチロール先のアカウントにあるRDSにローカルPCから接続
こんにちは!
AWS事業本部コンサルティング部の繁松です!
お客様から「スイッチロール先アカウントにあるRDSにローカルから接続したい」というお話がありましたので、
ローカルPCからEC2(踏み台サーバ)間をセッションマネージャーポートフォワードを使って、EC2(踏み台サーバ)からRDS間をソケット通信リレーで、ローカルPCからprivate環境にあるRDSへの接続を行います!
構成図
前提
- アカウントAからアカウントBにスイッチロールができる
- EC2(踏み台サーバ)はAmazon Linux 2
- スイッチロール先のアカウントにEC2(踏み台サーバ)からのみアクセスできるRDSがあり、ローカルPCから接続したい
※ロールの権限は必要に応じて変更してください。
今回は以下のように考えて進めます。
アカウント名 | 用途 | アカウントID | IAMユーザー名 | IAMロール名 |
---|---|---|---|---|
アカウントA | 踏み台AWSアカウント | 999999999999 | accountAuser | なし |
アカウントB | システム側のAWSアカウント | 000000000000 | なし | accountBrole |
事前準備、確認
IAMユーザー、スイッチロールの設定
アカウントBのロールにセッションマネージャー接続が可能な権限があることを確認します。
今回は以下の権限を追加しました。
- AmazonSSMFullAccess
MFAが有効化されているユーザーを使用する場合、ローカルPCのAWS CLI configには以下のようにスイッチロール先の設定を記載します。
profile名はaccountBで設定しています。
[profile accountB] role_arn = arn:aws:iam::<AWSアカウントBのアカウント番号>:role/accountBrole source_profile = accountA mfa_serial = arn:aws:iam::<AWSアカウントAのアカウント番号>:mfa/accountAuser
EC2(踏み台サーバ)
アカウントBにあるEC2(踏み台サーバ)へ接続する準備をします。
- VPCエンドポイント作成
今回private環境なので、以下のVPCエンドポイントを作成します。- com.amazonaws.ap-northeast-1.ssmmessages
- com.amazonaws.ap-northeast-1.ec2messages
- com.amazonaws.ap-northeast-1.ssm
- ロールに権限追加
EC2(踏み台サーバ)のロールにセッションマネージャー接続が可能な権限を追加します。
今回は以下の権限を追加しました。- AmazonSSMManagedInstanceCore
EC2(踏み台サーバ)に各種インストール
ローカルPCからEC2(踏み台サーバ)に接続しsocatのインストールと、セッションマネージャーのバージョン確認を行います。 ローカルPCのAWS CLIはaccountAのユーザーに切り替え以下のコマンドを実行していきます。
接続コマンド
[ローカルPCから実行]
$ aws ssm start-session --target <踏み台サーバのEC2インスタンスID> --region ap-northeast-1 --profile accountB
- socatのインストールを実施
EC2(踏み台サーバ)とRDSのソケット通信リレー用にsocatをインストールします。
[接続先のEC2(踏み台サーバ)から実行]
$ sudo yum install socat -y
- セッションマネージャーのバージョン確認
System Managerエージェントのバージョンが 2.3.672.0 以上である必要があります。
以下のコマンドで確認します。
[接続先のEC2(踏み台サーバ)から実行]
$ yum info amazon-ssm-agent Loaded plugins: extras_suggestions, langpacks, priorities, update-motd Installed Packages Name : amazon-ssm-agent Arch : x86_64 Version : 3.1.338.0
RDS
- セキュリティグループの確認
EC2(踏み台サーバ)のセキュリティグループから3306ポートの接続が許可されていることを確認します。
ローカルPC AWS CLI
- セッションマネージャー用プラグインのインストール
ローカルPCのAWS CLIにセッションマネージャー用のプラグインをインストールします。
こちらは環境にあわせてインストールしてください。
接続
準備が整ったので接続していきます。
各手順毎にコンソールを起動するので、手順1用、2用、3用で計3つ起動します。
1. ローカルPCからEC2(踏み台サーバ)間をセッションマネージャーポートフォワード
まず以下のコマンドでローカルPCからEC2(踏み台サーバ)間をセッションマネージャーポートフォワードさせます。
[ローカルPCから実行]
$ aws ssm start-session --target <踏み台サーバのEC2インスタンスID> --profile accountB --region ap-northeast-1 \ --document-name AWS-StartPortForwardingSession \ --parameters '{"portNumber":["3306"],"localPortNumber":["33060"]}'
2. EC2(踏み台サーバ)からRDS間をソケット通信リレー
次にEC2(踏み台サーバ)からRDS間をソケット通信リレーさせます。
EC2(踏み台サーバ)に接続します。
接続コマンド
[ローカルPCから実行]
$ aws ssm start-session --target <踏み台サーバのEC2インスタンスID> --region ap-northeast-1 --profile accountB
socatコマンド
[接続先のEC2(踏み台サーバ)から実行]
$ socat tcp4-listen:3306,reuseaddr,fork TCP:RDSのDNS:3306
3. RDSに接続
RDSに接続してみます。
[ローカルPCから実行]
$ mysql -u root -D db -h 127.0.0.1 -P 33060 -p
これで繋がればOKです。
4. MySQL Workbenchを使って接続
MySQL Workbenchを使って接続してみます。
以下の内容で設定します。
hostname:127.0.0.1
ポート:33060
繋がりました
さいごに
ローカル環境からスイッチロール先のprivate環境に接続するセッションマネージャーポートフォワードとsocatを使って接続してみました。
private環境への接続は悩むところだと思うので、お役に立てれば光栄です!
参考
参考にさせて頂きありがとうございます!